from django.contrib.auth import authenticate, login,logout as out
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.shortcuts import render, redirect

# Create your views here.
# 类视图 定义两个不同的方法处理两种不同的请求方式
# 类视图以请求方式为类方法 在对应的方式下编写对应的逻辑代码
# 自定义的类为普通类，成为视图类，继承
from django.views import View

from demo.form import ArticleForm
from user.forms import UserLRFrom


class UserView(View):
    # get类方法处理地址的get请求
    def get(self, request):
        # 还没有页面可以给用户
        form = UserLRFrom()
        return render(request, 'user/register.html',{'form': form})

    def post(self, request):
        # print(request.POST)
        # # 获取数据
        # username = request.POST.get("username")
        # password = request.POST.get('password')
        # # 校验数据
        # if not username:
        #     message = '注册失败，请输入用户名'
        # elif 2 > len(username) or len(username) > 10:
        #     message = '注册失败，用户名长度为2-10'
        # elif not password:
        #     message = '注册失败，请输入密码'
        # elif 6 > len(password) or len(password) > 20:
        #     message = '注册失败，密码长度为6-20'
        # # 保存数据
        # else:
        form = UserLRFrom(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            try:
                user = User(username=username)
                # 密码要做加密
                user.set_password(password)
                user.save()
            except IntegrityError:
                message="用户名已经存在，请重新输入"
            else:
                message = '注册成功'
        return render(request, 'user/register.html', context={"message": message})


class LoginView(View):
    def get(self, request):
        # get请求的时候获取页面数据，需要把表单返回给到模版进行渲染
        # 创建表单对象
        form = UserLRFrom()
        # 把表单对象传输给到模版 前端进行渲染的操作
        return render(request, 'user/login.html', context={'form': form})

    # def post(self,request):
    #     username = request.POST.get('username')
    #     password = request.POST.get('password')
    #     # 校验用户填写的信息格式是否有误
    #     if not username:
    #         message = '登录失败，请输入用户名'
    #     elif 2 > len(username) or len(username) > 10:
    #         message = '登录失败，用户名长度为2-10'
    #     elif not password:
    #         message = '登录失败，请输入密码'
    #     elif 6 > len(password) or len(password) > 20:
    #         message = '登录失败，密码长度为6-20'
    #     else:
    #         # 校验用户填写的数据跟数据库里边保存的是否一致
    #         try:
    #             user = User.objects.get(username=username)
    #         except User.DoesNotExist:
    #             message = '账号不存在，请注册后登录'
    #         else:
    #             # 校验用户的密码是否正确
    #             if user.check_password(password):
    #                 return redirect('index')
    #             else:
    #                 message = '密码错误'
    #     return render(request, 'user/login.html', context={'message': message})



    def post(self, request):
        # 创建表单对象 需要绑定用户在表单填写的数据，让表单对象帮我们完成校验
        form = UserLRFrom(request.POST)
        # is_valid()校验数据
        if form.is_valid():
            # 获取通过校验后的数据
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # 更换校验方法
            # 验证用户名和密码是否正确 校验通过
            # 如果正确的话，会返回一个用户对象，否则则会返回一个空值
            user=authenticate(username=username,password=password)
            # 用户是否存在
            # 不需要手动做状态维持，auth系统自动帮我做了
            if user:
                # 校验通过 把登录的用户信息放到请求对象中
                # 使用内置的login来完成用户信息的认证
                login(request,user)
                # login的作用（1）生成新的或者更新用户会话session
                # （2）登录的用户信息放到请求对象中 绑定到requests.user 后续的请求get post通过request来获取登录的用户
                # （3）处理会话的安全设置 超时时间
                # 获取地址栏中的next参数值保存的地址值
                next_url= request.GET.get('next')
                # 后面是否有next参数
                # GET是请求，get通过键获取值
                if next_url:
                    return redirect(next_url)
                return redirect('index')

            # 校验用户填写的数据跟数据库里面保存的是否一致
            # try:
            #     user = User.objects.get(username=username)
            # except User.DoesNotExist:
            #     message = "账号不存在，请注册后登录"
            # else:
            #     # 校验用户的密码是否正确
            #     if user.check_password(password):
            #         # 账号密码正确 创建session信息，做会话维持
            #         # 将用户名信息存贮在session表里面 通过键添加值
            #         request.session['username'] = username
            #         # 添加过期时间 过期时间单位为秒
            #         # request.session.set_expiry(300)
            #         return redirect('index')
            #         # return render(request,'demo/index.html')
            #     else:
            #         message = "密码错误"
        return render(request, 'user/login.html')
#
#
def logout(request, **kwargs):
    # 退出账号
    # request.session.flush()
    # 必须先通过auth系统验证 才能使用login或logout
    #调用auth系统的out方法来退出登录，把请求对象用登录用户信息给清除掉
    out(request)
    return redirect('login')




